﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLGrupoMezcla
    {
        #region Metodos
        /// <summary>
        /// Método devuelve lista Grupo Mezcla
        /// </summary>
        /// <returns></returns>
        public List<GrupoMezcla> ListarGrupoMezcla()
        {
            return Accesor.ListarGrupoMezcla();
        }

        /// <summary>
        /// Método inserta una Grupo Mezcla
        /// </summary>
        /// <param name="GrupoMezcla"></param>
        /// <returns></returns>
        public string InsertarGrupoMezcla(GrupoMezcla grupoMezcla, List<MuestraEspecialRequest> muestrasEspeciales)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                grupoMezcla.CodigoGrupoMezcla = Accesor.GenerarCodigoGrupoMezcla(grupoMezcla.Anio.ToString(), grupoMezcla.Mes);


                Accesor.InsertarGrupoMezcla(grupoMezcla);
                //A cada muestra especializa se actualizar con el Numero
                DAMuestraEspecial daMuestraEspecial = new DAMuestraEspecial();
                if (muestrasEspeciales != null)
                {
                    foreach (var muestra in muestrasEspeciales)
                    {
                        var muestraEdit = daMuestraEspecial.ObtenerMuestraEspecial(muestra.CodigoMuestraEspecial);
                        if (muestraEdit != null)
                        {
                            muestraEdit.CodigoGrupoMezcla = grupoMezcla.CodigoGrupoMezcla;
                            muestraEdit.CodigoPlataforma = muestra.CodigoPlataforma;
                            daMuestraEspecial.ModificarMuestraEspecial(muestraEdit);
                        }
                    }
                }

                transaction.Complete();
            }
            return grupoMezcla.CodigoGrupoMezcla;
        }
        /// <summary>
        /// Método modifica una Grupo Mezcla
        /// </summary>
        /// <param name="GrupoMezcla"></param>
        public void ModificarGrupoMezcla(GrupoMezcla grupoMezcla, List<MuestraEspecialRequest> muestrasEspeciales)
        {
            var grupoMezclaEdit = Accesor.ObtenerGrupoMezcla(grupoMezcla.CodigoGrupoMezcla);
            if (grupoMezclaEdit != null)
            {
                //Asigno los valores
                grupoMezclaEdit.FechaInicioCabeceo = grupoMezcla.FechaInicioCabeceo;
                grupoMezclaEdit.FechaFinCabeceo = grupoMezcla.FechaFinCabeceo;
                grupoMezclaEdit.FechaInicioPlanta = grupoMezcla.FechaInicioPlanta;
                grupoMezclaEdit.FechaFinPlanta = grupoMezcla.FechaFinPlanta;
                grupoMezclaEdit.Observacion = grupoMezcla.Observacion;
                grupoMezclaEdit.TotalMetrosProgramados = grupoMezcla.TotalMetrosProgramados;
                grupoMezclaEdit.TotalViajes = grupoMezcla.TotalViajes;
                grupoMezclaEdit.TotalAg = grupoMezcla.TotalAg;
                grupoMezclaEdit.TotalPb = grupoMezcla.TotalPb;
                grupoMezclaEdit.TotalZn = grupoMezcla.TotalZn;
                grupoMezclaEdit.TotalCu = grupoMezcla.TotalCu;
                grupoMezclaEdit.FechaInicioPlanta = grupoMezcla.FechaInicioPlanta;
                grupoMezclaEdit.FechaFinPlanta = grupoMezcla.FechaFinPlanta;

                using (TransactionScope transaction = new TransactionScope())
                {

                    DAGrupoMezclaResultado daGrupoMezclaResultado = new DAGrupoMezclaResultado();
                    var grupoResultados = daGrupoMezclaResultado.ListarGrupoMezclaResultadoPorCodigo(grupoMezcla.CodigoGrupoMezcla);
                    if (grupoResultados != null)
                    {
                        foreach (var item in grupoResultados)
                        {
                            daGrupoMezclaResultado.EliminarGrupoMezclaResultado(item);
                        }
                    }

                    //A cada muestra especializa se actualizar con el Numero
                    DAMuestraEspecial daMuestraEspecial = new DAMuestraEspecial();
                    //Libero las muestras que fueron utilizadas
                    var listaMuestrasLiberar = daMuestraEspecial.BuscarMuestraEspecialPorCodigoGrupoMezcla(grupoMezcla.CodigoGrupoMezcla);
                    if (listaMuestrasLiberar != null)
                    {
                        foreach (var item in listaMuestrasLiberar)
                        {
                            var muestraEdit = daMuestraEspecial.ObtenerMuestraEspecial(item.CodigoMuestraEspecial);
                            if (muestraEdit != null)
                            {
                                muestraEdit.CodigoGrupoMezcla = null;
                                daMuestraEspecial.ModificarMuestraEspecial(muestraEdit);
                            }
                        }
                    }

                    if (muestrasEspeciales != null)
                    {
                        foreach (var muestra in muestrasEspeciales)
                        {
                            var muestraEdit = daMuestraEspecial.ObtenerMuestraEspecial(muestra.CodigoMuestraEspecial);
                            if (muestraEdit != null)
                            {
                                muestraEdit.CodigoGrupoMezcla = grupoMezcla.CodigoGrupoMezcla;
                                muestraEdit.CodigoPlataforma = muestra.CodigoPlataforma;
                                daMuestraEspecial.ModificarMuestraEspecial(muestraEdit);
                            }
                        }
                    }

                    grupoMezclaEdit.GrupoMezclaResultado = grupoMezcla.GrupoMezclaResultado;
                    Accesor.ModificarGrupoMezcla(grupoMezclaEdit);
                    transaction.Complete();
                }
            }
        }
        /// <summary>
        /// Método que elimina Grupo Mezcla
        /// </summary>
        /// <param name="GrupoMezcla"></param>
        public void EliminarGrupoMezcla(string codigoGrupoMezcla)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                DAGrupoMezclaResultado daGrupoMezclaResultado = new DAGrupoMezclaResultado();
                var grupoResultados = daGrupoMezclaResultado.ListarGrupoMezclaResultadoPorCodigo(codigoGrupoMezcla);
                if (grupoResultados != null)
                {
                    foreach (var item in grupoResultados)
                    {
                        daGrupoMezclaResultado.EliminarGrupoMezclaResultado(item);
                    }
                }

                //Libera las muestras utilizadas
                DAMuestraEspecial daMuestraEspecial = new DAMuestraEspecial();
                //Libero las muestras que fueron utilizadas
                var listaMuestrasLiberar = daMuestraEspecial.BuscarMuestraEspecialPorCodigoGrupoMezcla(codigoGrupoMezcla);
                if (listaMuestrasLiberar != null)
                {
                    foreach (var item in listaMuestrasLiberar)
                    {
                        var muestraEdit = daMuestraEspecial.ObtenerMuestraEspecial(item.CodigoMuestraEspecial);
                        if (muestraEdit != null)
                        {
                            muestraEdit.CodigoGrupoMezcla = null;
                            daMuestraEspecial.ModificarMuestraEspecial(muestraEdit);
                        }
                    }
                }

                var grupoMezcla = Accesor.ObtenerGrupoMezcla(codigoGrupoMezcla);
                if (grupoMezcla != null)
                {
                    Accesor.EliminarGrupoMezcla(grupoMezcla);
                }
                transaction.Complete();
            }
        }
        /// <summary>
        /// Método para obtener Grupo Mezcla
        /// </summary>
        /// <param name="codigoMuestraMensaje"></param>
        /// <returns></returns>
        public GrupoMezcla ObtenerGrupoMezcla(string codigoGrupoMezcla)
        {
            return Accesor.ObtenerGrupoMezcla(codigoGrupoMezcla);
        }

        /// <summary>
        /// Devuelve lista de Grupo Mezcla
        /// </summary>
        /// <param name="codigoCanal"></param>
        /// <returns></returns>
        public List<buscarBlending_Result> BuscarGrupoMezcla(int anio)
        {
            return Accesor.BuscarGrupoMezcla(anio);
        }

        /// <summary>
        /// Devuelve el codigo de grupo mezcla generado
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoTipoCancha"></param>
        /// <returns></returns>
        public string GenerarCodigoGrupoMezcla(string anio, string mes)
        {
            return Accesor.GenerarCodigoGrupoMezcla(anio, mes);
        }
        #endregion

        #region Accesor
        private static DAGrupoMezcla Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAGrupoMezcla(); }
        }
        #endregion
    }
}
